package iks.utils.collision
{
	/**
	 * 检测圆与矩形的碰撞, 参数坐标指的都是圆和矩形的中心
	 * @param	cx 圆心x坐标
	 * @param	cy 圆心y坐标
	 * @param	radius 圆心半径
	 * @param	rx 矩形x坐标
	 * @param	ry 矩形y坐标
	 * @param	rw 矩形宽度
	 * @param	rh 矩形高度
	 * @return 碰撞返回true, 否则返回false
	 */
	public function hitTest_CircleAndRectangle(cx : Number, cy : Number, radius : Number, 
						rx : Number, ry : Number, rw : Number, rh : Number) : Boolean
	{
		// 分别计算圆心和矩形中心在X轴和Y轴方向上的长度, 和矩形宽高的一半.
		var dx : Number = Math.abs(cx - rx);
		var dy : Number = Math.abs(cy - ry);
		var halfW : Number = rw / 2;
		var halfH : Number = rh / 2;
		
		// 图我就不想画了，在脑海里想象一下，两个形状。当两个中心在X轴方向的距离大于radius＋halfW时，
		// 两个形状必不相交。同理，在Y轴也是这个原理。这里展示了圆跟矩形的中心满足最大距离时不相交的情况.
		if ((dx >= radius + halfW) || (dy >= radius + halfH))
			return false;
		
		// 接下来是圆心与矩形的中心距离，满足相交的最小距离，这个条件正确的前提是先执行上面的判断.
		// 这时一定是 dx < halfW + radius && dy < halfH + radius.
		// 然后再执行如下判断。两个中心在X轴方向的距离小于等于halfW时，两个形状必相交。同理，在Y轴也一样.
		if (dx <= halfW)
			return true;
		
		if (dy <= halfH)
			return true;
		
		// 好了，可能感觉上上面已经满足了判断圆与矩形相交的所有情况，其实不是，仔细在脑海里想下，如果
		// 在X轴方向的距离大于halfW小于halfW＋radius，同时在Y轴方向的距离大于halfH小于halfH＋radius，
		// 这时候也有可能相交。如果画图表现的话就是矩形的一个角与圆形相交，满足这个情况的条件是，矩形的角
		// 那个点与圆心的距离小于圆的半径.
		dx = dx - halfW;
		dy = dy - halfH;
		var distance : Number = dx * dx + dy * dy;
		return distance < radius * radius;
	}
}

































///////////////////////////////////////////////////////////////////////////////////////////////////
// end file


